#!/bin/bash

# =============================================================================
# Admin服务启动脚本
# 作者: AI Assistant
# 创建时间: $(date +%Y-%m-%d)
# =============================================================================

# 配置参数
JAR_FOLDER="/mydata/jars/yccloud17/admin"
JAR_NAME="admin-0.0.1-SNAPSHOT.jar"
JAR_PATH="$JAR_FOLDER/$JAR_NAME"
LOG_FILE="$JAR_FOLDER/admin.log"
PID_FILE="$JAR_FOLDER/admin.pid"
APPLICATION_YML="$JAR_FOLDER/application.yml"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检查Java环境
check_java() {
    log_info "检查Java运行环境..."
    if ! command -v java &> /dev/null; then
        log_error "Java未安装或不在PATH中"
        exit 1
    fi
    
    JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
    log_info "Java版本: $JAVA_VERSION"
}

# 检查JAR文件
check_jar() {
    log_info "检查JAR文件..."
    if [ ! -f "$JAR_PATH" ]; then
        log_error "JAR文件不存在: $JAR_PATH"
        exit 1
    fi
    
    if [ ! -r "$JAR_PATH" ]; then
        log_error "JAR文件无读取权限: $JAR_PATH"
        exit 1
    fi
    
    log_info "JAR文件检查通过: $JAR_PATH"
}

# 检查配置文件
check_config() {
    log_info "检查配置文件..."
    if [ ! -f "$APPLICATION_YML" ]; then
        log_warn "配置文件不存在: $APPLICATION_YML，将使用默认配置"
        APPLICATION_YML=""
    else
        log_info "配置文件检查通过: $APPLICATION_YML"
    fi
}

# 检查服务状态
check_status() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            log_warn "服务已在运行，PID: $PID"
            return 0
        else
            log_warn "PID文件存在但进程已死亡，清理PID文件"
            rm -f "$PID_FILE"
        fi
    fi
    
    # 通过进程名检查
    PID=$(pgrep -f "$JAR_NAME")
    if [ -n "$PID" ]; then
        log_warn "发现同名进程，PID: $PID"
        return 0
    fi
    
    return 1
}

# 创建必要目录
create_directories() {
    log_info "创建必要目录..."
    mkdir -p "$JAR_FOLDER"
    mkdir -p "$(dirname "$LOG_FILE")"
    
    # 设置权限
    chmod 755 "$JAR_FOLDER"
}

# 启动服务
start_service() {
    log_info "启动Admin服务..."
    
    # 构建启动命令
    START_CMD="nohup java -jar"
    
    # JVM参数
    JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
    START_CMD="$START_CMD $JVM_OPTS"
    
    # 配置文件
    if [ -n "$APPLICATION_YML" ]; then
        START_CMD="$START_CMD --spring.config.location=$APPLICATION_YML"
    fi
    
    # 完整启动命令
    START_CMD="$START_CMD $JAR_PATH >> $LOG_FILE 2>&1 & echo \$! > $PID_FILE"
    
    log_debug "启动命令: $START_CMD"
    
    # 执行启动
    eval $START_CMD
    
    # 等待启动
    sleep 3
    
    # 检查启动状态
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            log_info "服务启动成功！PID: $PID"
            log_info "日志文件: $LOG_FILE"
            log_info "PID文件: $PID_FILE"
            return 0
        fi
    fi
    
    log_error "服务启动失败，请检查日志: $LOG_FILE"
    return 1
}

# 主函数
main() {
    log_info "开始启动Admin服务..."
    
    # 检查Java环境
    check_java
    
    # 检查JAR文件
    check_jar
    
    # 检查配置文件
    check_config
    
    # 创建必要目录
    create_directories
    
    # 检查服务状态
    if check_status; then
        log_warn "服务已在运行，无需重复启动"
        exit 0
    fi
    
    # 启动服务
    if start_service; then
        log_info "Admin服务启动完成！"
        exit 0
    else
        log_error "Admin服务启动失败！"
        exit 1
    fi
}

# 执行主函数
main "$@"


